package com.hotel.controller.user;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.hotel.security.model.RedisCache;
import com.hotel.security.service.LoginService;
import com.hotel.util.JwtUtil;
import com.hotel.util.R;
import com.hotel.entity.User;
import com.hotel.service.user.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

@RequestMapping("/user")
@RestController
@CrossOrigin
@Slf4j
public class UserController {

    @Resource
    private UserService userService;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private LoginService loginService;

    @Resource
    private RedisCache redisCache;

    /**
     * 登录
     *
     * @return
     */
    @PostMapping("/login")
    public R getUser(User user) {
        try {
            // 从数据库查出用户信息
            LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(User::getUserLoginName, user.getUserLoginName());
            User userPwd = userService.getOne(queryWrapper);
            // 用户不存在，直接认证失败
            if (userPwd == null || userPwd.getUserStatus() == 1) {
                return new R(R.FORBIDDEN, "登录失败,账户或密码错误！");
            }
            if (userPwd.getUserStatus() == 2) {
                return new R(R.FORBIDDEN, "登录失败,账户已封禁！");
            }
            Object login = loginService.login(user);
            return new R(R.OK, "登录成功", login);
        } catch (Exception e) {
            // 密码校验失败
            return new R(R.FORBIDDEN, "登录失败,账户或密码错误！");
        }
//
//        //BCryptPasswordEncoder加密
//        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
////        String password = encoder.encode(user.getUserPassword().trim());
//        // 校验这两个密码是否是同一个密码
//        // matches方法第一个参数是原密码，第二个参数是加密后的密码
//        boolean matches = encoder.matches(user.getUserPassword(), userPwd.getUserPassword());
//
//        // 用户名与密码校验
//        if (matches && userPwd.getUserName().equals(user.getUserName())) {
////            // 校验成功，生成jwt返回数据
//            String token = JwtUtil.createToken(userPwd.getUserName());
//            userPwd.setToken(token);
//            //校验成功后把生成的jwt保存在redis当中去
//            stringRedisTemplate.opsForValue().set(userPwd.getUserName(), token, JwtUtil
//                    .EXPIRATION, TimeUnit.SECONDS);
//
//            return new R(R.OK, "登录成功", userPwd);
//        }

    }


    /**
     * 退出登录
     *
     * @param token
     * @return
     */
    @DeleteMapping("/loginout")
    public R exit(String token) {
        try {
            if (StringUtils.isNotBlank(token)) {
                String userName = JwtUtil.getUsername(token);  //根据传回来的token解析出他的用户名
//                String redisToken = stringRedisTemplate.opsForValue().get(userName);  //获取redis中的token
                Object cacheObject = redisCache.getCacheObject(userName);
                boolean ifDataToken = JwtUtil.validateToken(token);  //判断有效时间
                // 如果能够获取到数据，说明token未过期
                if (cacheObject != null && ifDataToken) {
                    // 如果两个token相等，代表 token有效
                    // 请求放行
                    redisCache.deleteObject(userName);  //删除redis中的token
                    return new R(R.OK, "退出成功！");
                }
            }
            // 退出失败
            return new R(R.SERVER_ERROR, "退出失败！");
        } catch (Exception e) {
            // 退出失败
            return new R(R.SERVER_ERROR, "退出失败！");
        }

//        if(token != null){
//            stringRedisTemplate.delete(JwtUtil.getUsername(token));  //删除redis中的token
//            return new R(R.OK, "退出成功！");
//        }
    }
}
